package com.cencat.order.domain;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalTime;

/**
 * 固定商家信息实体类
 * 
 * @author cencat
 * @date 2024-01-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("sys_merchant")
public class Merchant implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 商家ID
     */
    @TableId(value = "merchant_id", type = IdType.AUTO)
    private Long merchantId;

    /**
     * 商家编号
     */
    @NotBlank(message = "商家编号不能为空")
    @Size(max = 50, message = "商家编号长度不能超过50个字符")
    @TableField("merchant_code")
    private String merchantCode;

    /**
     * 商家名称
     */
    @NotBlank(message = "商家名称不能为空")
    @Size(max = 100, message = "商家名称长度不能超过100个字符")
    @TableField("merchant_name")
    private String merchantName;

    /**
     * 商家简称
     */
    @Size(max = 50, message = "商家简称长度不能超过50个字符")
    @TableField("merchant_short_name")
    private String merchantShortName;

    /**
     * 商家类型(1-餐饮 2-零售 3-生鲜 4-医药 5-其他)
     */
    @NotNull(message = "商家类型不能为空")
    @TableField("merchant_type")
    private Integer merchantType;

    /**
     * 商家等级(1-普通 2-银牌 3-金牌 4-钻石)
     */
    @Min(value = 1, message = "商家等级不能小于1")
    @Max(value = 4, message = "商家等级不能大于4")
    @TableField("merchant_level")
    private Integer merchantLevel;

    /**
     * 商家状态(0-禁用 1-启用 2-审核中 3-审核失败)
     */
    @NotNull(message = "商家状态不能为空")
    @TableField("status")
    private Integer status;

    /**
     * 营业执照号
     */
    @NotBlank(message = "营业执照号不能为空")
    @Size(max = 50, message = "营业执照号长度不能超过50个字符")
    @TableField("business_license")
    private String businessLicense;

    /**
     * 统一社会信用代码
     */
    @Size(max = 50, message = "统一社会信用代码长度不能超过50个字符")
    @TableField("credit_code")
    private String creditCode;

    /**
     * 法人姓名
     */
    @NotBlank(message = "法人姓名不能为空")
    @Size(max = 50, message = "法人姓名长度不能超过50个字符")
    @TableField("legal_person")
    private String legalPerson;

    /**
     * 法人身份证号
     */
    @Pattern(regexp = "^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$", message = "身份证号格式不正确")
    @TableField("legal_id_card")
    private String legalIdCard;

    /**
     * 联系人姓名
     */
    @NotBlank(message = "联系人姓名不能为空")
    @Size(max = 50, message = "联系人姓名长度不能超过50个字符")
    @TableField("contact_name")
    private String contactName;

    /**
     * 联系人手机号
     */
    @NotBlank(message = "联系人手机号不能为空")
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
    @TableField("contact_phone")
    private String contactPhone;

    /**
     * 联系人邮箱
     */
    @Email(message = "邮箱格式不正确")
    @Size(max = 100, message = "邮箱长度不能超过100个字符")
    @TableField("contact_email")
    private String contactEmail;

    /**
     * 商家地址
     */
    @NotBlank(message = "商家地址不能为空")
    @Size(max = 200, message = "商家地址长度不能超过200个字符")
    @TableField("address")
    private String address;

    /**
     * 详细地址
     */
    @Size(max = 200, message = "详细地址长度不能超过200个字符")
    @TableField("detailed_address")
    private String detailedAddress;

    /**
     * 纬度
     */
    @DecimalMin(value = "-90.0", message = "纬度范围不正确")
    @DecimalMax(value = "90.0", message = "纬度范围不正确")
    @TableField("latitude")
    private BigDecimal latitude;

    /**
     * 经度
     */
    @DecimalMin(value = "-180.0", message = "经度范围不正确")
    @DecimalMax(value = "180.0", message = "经度范围不正确")
    @TableField("longitude")
    private BigDecimal longitude;

    /**
     * 省份编码
     */
    @Size(max = 10, message = "省份编码长度不能超过10个字符")
    @TableField("province_code")
    private String provinceCode;

    /**
     * 省份名称
     */
    @Size(max = 50, message = "省份名称长度不能超过50个字符")
    @TableField("province_name")
    private String provinceName;

    /**
     * 城市编码
     */
    @Size(max = 10, message = "城市编码长度不能超过10个字符")
    @TableField("city_code")
    private String cityCode;

    /**
     * 城市名称
     */
    @Size(max = 50, message = "城市名称长度不能超过50个字符")
    @TableField("city_name")
    private String cityName;

    /**
     * 区县编码
     */
    @Size(max = 10, message = "区县编码长度不能超过10个字符")
    @TableField("district_code")
    private String districtCode;

    /**
     * 区县名称
     */
    @Size(max = 50, message = "区县名称长度不能超过50个字符")
    @TableField("district_name")
    private String districtName;

    /**
     * 营业开始时间
     */
    @JsonFormat(pattern = "HH:mm:ss")
    @TableField("business_start_time")
    private LocalTime businessStartTime;

    /**
     * 营业结束时间
     */
    @JsonFormat(pattern = "HH:mm:ss")
    @TableField("business_end_time")
    private LocalTime businessEndTime;

    /**
     * 营业天数(1-周一到周五 2-周六周日 3-全周)
     */
    @TableField("business_days")
    private Integer businessDays;

    /**
     * 配送范围(公里)
     */
    @DecimalMin(value = "0.0", message = "配送范围不能小于0")
    @TableField("delivery_range")
    private BigDecimal deliveryRange;

    /**
     * 起送金额
     */
    @DecimalMin(value = "0.0", message = "起送金额不能小于0")
    @TableField("min_order_amount")
    private BigDecimal minOrderAmount;

    /**
     * 配送费
     */
    @DecimalMin(value = "0.0", message = "配送费不能小于0")
    @TableField("delivery_fee")
    private BigDecimal deliveryFee;

    /**
     * 免配送费金额
     */
    @DecimalMin(value = "0.0", message = "免配送费金额不能小于0")
    @TableField("free_delivery_amount")
    private BigDecimal freeDeliveryAmount;

    /**
     * 平均配送时长(分钟)
     */
    @Min(value = 0, message = "平均配送时长不能小于0")
    @TableField("avg_delivery_time")
    private Integer avgDeliveryTime;

    /**
     * 商家描述
     */
    @Size(max = 500, message = "商家描述长度不能超过500个字符")
    @TableField("description")
    private String description;

    /**
     * 商家LOGO
     */
    @Size(max = 200, message = "商家LOGO长度不能超过200个字符")
    @TableField("logo")
    private String logo;

    /**
     * 商家图片
     */
    @Size(max = 500, message = "商家图片长度不能超过500个字符")
    @TableField("images")
    private String images;

    /**
     * 营业执照图片
     */
    @Size(max = 200, message = "营业执照图片长度不能超过200个字符")
    @TableField("license_image")
    private String licenseImage;

    /**
     * 身份证正面图片
     */
    @Size(max = 200, message = "身份证正面图片长度不能超过200个字符")
    @TableField("id_card_front")
    private String idCardFront;

    /**
     * 身份证反面图片
     */
    @Size(max = 200, message = "身份证反面图片长度不能超过200个字符")
    @TableField("id_card_back")
    private String idCardBack;

    /**
     * 认证状态(0-未认证 1-认证中 2-已认证 3-认证失败)
     */
    @TableField("auth_status")
    private Integer authStatus;

    /**
     * 认证时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("auth_time")
    private LocalDateTime authTime;

    /**
     * 认证失败原因
     */
    @Size(max = 200, message = "认证失败原因长度不能超过200个字符")
    @TableField("auth_fail_reason")
    private String authFailReason;

    /**
     * 绑定司机数量
     */
    @Min(value = 0, message = "绑定司机数量不能小于0")
    @TableField("driver_count")
    private Integer driverCount;

    /**
     * 最大绑定司机数
     */
    @Min(value = 0, message = "最大绑定司机数不能小于0")
    @TableField("max_driver_count")
    private Integer maxDriverCount;

    /**
     * 订单总数
     */
    @Min(value = 0, message = "订单总数不能小于0")
    @TableField("total_orders")
    private Integer totalOrders;

    /**
     * 完成订单数
     */
    @Min(value = 0, message = "完成订单数不能小于0")
    @TableField("completed_orders")
    private Integer completedOrders;

    /**
     * 取消订单数
     */
    @Min(value = 0, message = "取消订单数不能小于0")
    @TableField("cancelled_orders")
    private Integer cancelledOrders;

    /**
     * 订单完成率(%)
     */
    @DecimalMin(value = "0.0", message = "订单完成率不能小于0")
    @DecimalMax(value = "100.0", message = "订单完成率不能大于100")
    @TableField("completion_rate")
    private BigDecimal completionRate;

    /**
     * 平均评分
     */
    @DecimalMin(value = "0.0", message = "平均评分不能小于0")
    @DecimalMax(value = "5.0", message = "平均评分不能大于5")
    @TableField("avg_rating")
    private BigDecimal avgRating;

    /**
     * 评价数量
     */
    @Min(value = 0, message = "评价数量不能小于0")
    @TableField("rating_count")
    private Integer ratingCount;

    /**
     * 好评率(%)
     */
    @DecimalMin(value = "0.0", message = "好评率不能小于0")
    @DecimalMax(value = "100.0", message = "好评率不能大于100")
    @TableField("positive_rate")
    private BigDecimal positiveRate;

    /**
     * 总收入
     */
    @DecimalMin(value = "0.0", message = "总收入不能小于0")
    @TableField("total_income")
    private BigDecimal totalIncome;

    /**
     * 本月收入
     */
    @DecimalMin(value = "0.0", message = "本月收入不能小于0")
    @TableField("monthly_income")
    private BigDecimal monthlyIncome;

    /**
     * 总支出
     */
    @DecimalMin(value = "0.0", message = "总支出不能小于0")
    @TableField("total_expense")
    private BigDecimal totalExpense;

    /**
     * 本月支出
     */
    @DecimalMin(value = "0.0", message = "本月支出不能小于0")
    @TableField("monthly_expense")
    private BigDecimal monthlyExpense;

    /**
     * 账户余额
     */
    @TableField("account_balance")
    private BigDecimal accountBalance;

    /**
     * 信用额度
     */
    @DecimalMin(value = "0.0", message = "信用额度不能小于0")
    @TableField("credit_limit")
    private BigDecimal creditLimit;

    /**
     * 已用信用额度
     */
    @DecimalMin(value = "0.0", message = "已用信用额度不能小于0")
    @TableField("used_credit")
    private BigDecimal usedCredit;

    /**
     * 结算周期(天)
     */
    @Min(value = 1, message = "结算周期不能小于1天")
    @TableField("settlement_cycle")
    private Integer settlementCycle;

    /**
     * 结算方式(1-日结 2-周结 3-月结)
     */
    @TableField("settlement_method")
    private Integer settlementMethod;

    /**
     * 银行账户
     */
    @Size(max = 50, message = "银行账户长度不能超过50个字符")
    @TableField("bank_account")
    private String bankAccount;

    /**
     * 开户行
     */
    @Size(max = 100, message = "开户行长度不能超过100个字符")
    @TableField("bank_name")
    private String bankName;

    /**
     * 开户人
     */
    @Size(max = 50, message = "开户人长度不能超过50个字符")
    @TableField("account_holder")
    private String accountHolder;

    /**
     * 特殊要求
     */
    @Size(max = 500, message = "特殊要求长度不能超过500个字符")
    @TableField("special_requirements")
    private String specialRequirements;

    /**
     * 服务标签
     */
    @Size(max = 200, message = "服务标签长度不能超过200个字符")
    @TableField("service_tags")
    private String serviceTags;

    /**
     * 优惠信息
     */
    @Size(max = 500, message = "优惠信息长度不能超过500个字符")
    @TableField("promotion_info")
    private String promotionInfo;

    /**
     * 通知设置(JSON格式)
     */
    @TableField("notification_settings")
    private String notificationSettings;

    /**
     * 配送设置(JSON格式)
     */
    @TableField("delivery_settings")
    private String deliverySettings;

    /**
     * 是否推荐(0-否 1-是)
     */
    @TableField("is_recommended")
    private Integer isRecommended;

    /**
     * 是否热门(0-否 1-是)
     */
    @TableField("is_popular")
    private Integer isPopular;

    /**
     * 是否新商家(0-否 1-是)
     */
    @TableField("is_new")
    private Integer isNew;

    /**
     * 排序权重
     */
    @Min(value = 0, message = "排序权重不能小于0")
    @TableField("sort_weight")
    private Integer sortWeight;

    /**
     * 最后登录时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("last_login_time")
    private LocalDateTime lastLoginTime;

    /**
     * 最后下单时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("last_order_time")
    private LocalDateTime lastOrderTime;

    /**
     * 删除标志(0-存在 1-删除)
     */
    @TableLogic
    @TableField("del_flag")
    private Integer delFlag;

    /**
     * 备注
     */
    @Size(max = 500, message = "备注长度不能超过500个字符")
    @TableField("remark")
    private String remark;

    /**
     * 创建者
     */
    @TableField(value = "create_by", fill = FieldFill.INSERT)
    private String createBy;

    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 更新者
     */
    @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
    private String updateBy;

    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    /**
     * 扩展字段1
     */
    @Size(max = 200, message = "扩展字段1长度不能超过200个字符")
    @TableField("ext_field1")
    private String extField1;

    /**
     * 扩展字段2
     */
    @Size(max = 200, message = "扩展字段2长度不能超过200个字符")
    @TableField("ext_field2")
    private String extField2;

    /**
     * 扩展字段3
     */
    @Size(max = 200, message = "扩展字段3长度不能超过200个字符")
    @TableField("ext_field3")
    private String extField3;

    /**
     * 版本号(乐观锁)
     */
    @Version
    @TableField("version")
    private Integer version;
}